/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Στο παρόν module υπάρχουν δομές, μέθοδοι και λειτουργίες που αφορούν στη
// συζήτηση που εξελίσσεται στο καφενείο και στα τραπέζια. Πράγματι, υπάρχει
// δημόσια συζήτηση στην οποία συμμετέχουν όλοι οι παίκτες, θεατές και θαμώνες
// του καφενείου όσο βρίσκονται σε οπτική καφενείου, ενώ όσοι βρίσκονται σε
// οπτική τραπεζιού συμμετέχουν σε συζήτηση που αφορά μόνο τους συμμετέχοντες
// στο τραπέζι είτε ως παίκτες είτε ως θεατές.

// Τα περισσότερα αντικείμενα που αφορούν στη συζήτηση εντάσσονται στο singleton
// "sizitisi" που χρησιμποιείται ως namespace.

Prefadoros.sizitisi = {
	// Ακολουθούν τα jQuery αντίστοιχα του πεδίου γραφής σχολίων συζήτησης,
	// της περιοχής συζήτησης καφενείου και της περιοχής συζήτησης τραπεζιού.
	// Επειδή τα αντίστοιχα DOM elements δεν αλλάζουν κατά τη διάρκεια τής
	// συνεδρίας, τα υπολογίζουμε στην αρχή και τα χρησιμοποιούμε κατόπιν.

	inputJQL: null,
	kafenioJQL: null,
	trapeziJQL: null,
	sigasiJQL: null,

	// Το property "molivi" δείχνει αν έχουμε ήδη στείλει σήμα στον server
	// ότι γράφουμε σχόλιο συζήτησης, ή όχι.

	molivi: false,

	zebraPaleta: [
		'8A0808',
		'006600',
		'084B8A',
		'CD5C5C',
		'663300',
		'FF3300',
		'666699',
		'B45F04',
		'B4045F',
	],

	zebraIndex: 0,

	zebraColor: {},

	diagrafiCounter: 0,

	diagrafiTimer: null,
};

Prefadoros.sizitisi.scrollSwitch = function(e) {
	e.stopPropagation();
	if ($(this).data('noScroll')) $(this).data('noScroll', false).removeClass('sizitisiScrollOff').scrollKato();
	else $(this).data('noScroll', true).addClass('sizitisiScrollOff');
}

Prefadoros.sizitisi.setup = function() {
	Prefadoros.sizitisi.zebraColor[Prefadoros.ego.login] = '556B2F';
	Prefadoros.sizitisi.inputJQL = $('#sizitisiInput').akrivosEna();
	Prefadoros.sizitisi.kafenioJQL = $('#sizitisiKafenio').akrivosEna().
		on('click', Prefadoros.sizitisi.scrollSwitch);
	Prefadoros.sizitisi.trapeziJQL = $('#sizitisiTrapezi').akrivosEna().
		on('click', Prefadoros.sizitisi.scrollSwitch);

	Prefadoros.sizitisi.inputJQL.
	on('keyup', function(e) {
		e.stopPropagation();
		switch (e.which) {
		case 13:
			Prefadoros.sizitisi.apostoli();
			break;
		case 27:
			Prefadoros.sizitisi.inputJQL.val('');
		default:
			Prefadoros.sizitisi.proepiskopisi();
			break;
		}
	});

	Prefadoros.sizitisi.kafenioJQL.add(Prefadoros.sizitisi.trapeziJQL).
	on('mouseover', '.sizitisiPektis', function(e) {
		var sxolio, pote;
		e.stopPropagation();
		sxolio = $(this).parent();
		pote = parseInt(sxolio.find('.sizitisiPote').text()) + Client.timeDif;
		sxolio.find('.sizitisiEtop').text(globals.pote(pote));
	}).
	on('mouseleave', '.sizitisiPektis', function(e) {
		e.stopPropagation();
		$(this).parent().find('.sizitisiEtop').empty();
	});

	$('#sizitisiApostoliIcon').akrivosEna().on('click', function(e) {
		e.stopPropagation();
		Prefadoros.input.apiko();
		Prefadoros.sizitisi.apostoli();
	});

	$('#sizitisiClearIcon').akrivosEna().on('click', function(e) {
		var tora = globals.toraServer();

		e.stopPropagation();
		Prefadoros.input.apiko();
		Client.node('moliviStop');
		Prefadoros.sizitisi.inputJQL.val('');
		Prefadoros.sizitisi.trapeziJQL.find('.sizitisiProepiskopisi').remove();
		Prefadoros.sizitisi.trapeziJQL.find('.sizitisiMolivi').each(function() {
			var pote = $(this).find('.sizitisiPote').text();
			if (isNaN(pote) || (tora - pote > 20)) $(this).remove();
		});
	});

	$('#sizitisiDiagrafiIcon').akrivosEna().on('click', function(e) {
		e.stopPropagation();
		Prefadoros.input.apiko();
		if (!Prefadoros.ego.trapezi) return Client.fyi.spano('Δεν είστε σε τραπέζι');
		if (!(Prefadoros.sizitisi.trapeziJQL.find('.sizitisiSxolio').
			not('.sizitisiProepiskopisi').
			not('.sizitisiMolivi')).length) return Client.fyi.spano('Δεν υπάρχει συζήτηση για διαγραφή', 1);

		if (Prefadoros.ego.sinedria.oxiPektis() && Prefadoros.ego.pektis.oxiEpoptis())
			return Client.fyi.spano('Δεν έχετε δικαίωμα διαγραφής ως θεατής');

		if (!Prefadoros.sizitisi.diagrafiCounter) {
			if (Prefadoros.sizitisi.diagrafiTimer) clearTimeout(Prefadoros.sizitisi.diagrafiTimer);
			Prefadoros.sizitisi.diagrafiTimer = setTimeout(function() {
				Prefadoros.sizitisi.diagrafiTimer = null;
				Prefadoros.sizitisi.diagrafiCounter = 0;
			}, 1200);
		}
		else if (Prefadoros.sizitisi.diagrafiCounter > 3) {
			Prefadoros.sizitisi.diagrafiTimer = null;
			Prefadoros.sizitisi.diagrafiCounter = 0;
			Prefadoros.sizitisi.diagrafiOla(e);
			return;
		}

		Prefadoros.sizitisi.diagrafiCounter++;
		Client.node('sizitisiDiagrafi', function(rsp) {
			Client.fyi.pano(rsp);
		});
	});

	Prefadoros.sizitisi.sigasiJQL = $('#sizitisiSigasiIcon').akrivosEna().
	on('click', function(e) {
		e.stopPropagation();
		Prefadoros.input.apiko();
		$('#ixos').find('.funchatIxos').remove();
	});
}

Prefadoros.sizitisi.diagrafiOla = function(e) {
	var x = e.pageX - 320;
	var y = e.pageY - 200;
	$('.sizitisiDiagrafiDialogos').remove();
	$('<div class="dialogos sizitisiDiagrafiDialogos">Θέλετε πράγματι να διαγράψετε όλη τη συζήτηση;</div>').
	prependTo('#ofelimo').siromeno({top:y+'px',left:x+'px'}).pineza().
	anadisi().append($('<div class="dexia">').
		append($('<div>').dialogosButton('ΝΑΙ', function() {
			Client.node('sizitisiDiagrafi', 'ola', function(rsp) {
				Client.fyi.pano(rsp);
			});
		})).
		append($('<div>').dialogosButton('ΟΧΙ'))
	);
	Client.sound.dialogos();
}

Prefadoros.sizitisi.apostoli = function(kimeno, exoteriko) {
	var sxolio, params;

	Prefadoros.sizitisi.moliviStop();
	if (kimeno === undefined) kimeno = Prefadoros.sizitisi.inputJQL.val();
	if (!kimeno) return;

	sxolio = new Sizitisi({
		'pektis': Prefadoros.ego.login,
		'kimeno': kimeno,
		'pote': 0,
	});

	params = 'kimeno=' + kimeno.uri();
	$('.sizitisiProepiskopisi').remove();

	if ((Prefadoros.optiki.optiki != 'Καφενείο') && Prefadoros.ego.isTrapezi()) {
		Prefadoros.sizitisi.trapeziJQL.sizitisiAdd(sxolio);
		params += '&trapezi=' + Prefadoros.ego.trapezi.kodikos;
	}
	else {
		Prefadoros.sizitisi.kafenioJQL.sizitisiAdd(sxolio);
	}

	if (!exoteriko) Prefadoros.sizitisi.inputJQL.val('');
	Client.node('sizitisiSxolio', params, function(rsp) {
		Client.fyi.spano(rsp);
	});
}

Prefadoros.sizitisi.proepiskopisi = function() {
	var kimeno;

	$('.sizitisiProepiskopisi').remove();
	kimeno = Prefadoros.sizitisi.inputJQL.val();
	if (kimeno) {
		if (Prefadoros.optiki.optiki == 'Καφενείο') {
			Prefadoros.sizitisi.moliviKafenio();
			Prefadoros.sizitisi.kafenioJQL.proepiskopisi(kimeno);
		}
		else {
			Prefadoros.sizitisi.moliviTrapezi();
			Prefadoros.sizitisi.trapeziJQL.proepiskopisi(kimeno);
		}
	}
	else Prefadoros.sizitisi.moliviStop();
}

Prefadoros.sizitisi.moliviKafenio = function() {
	if (Prefadoros.sizitisi.molivi) return;
	Prefadoros.sizitisi.molivi = true;

	Client.node('moliviStart');
}

Prefadoros.sizitisi.moliviTrapezi = function() {
	var trapeziKodikos, trapezi;

	if (Prefadoros.sizitisi.molivi) return;
	Prefadoros.sizitisi.molivi = true;

	if (Prefadoros.ego.oxiTrapezi()) Prefadoros.sizitisi.moliviKafenio();
	else Client.node('moliviStart', 'trapezi=' + Prefadoros.ego.trapezi.kodikos);
}

Prefadoros.sizitisi.moliviStop = function() {
	if (!Prefadoros.sizitisi.molivi) return;
	Prefadoros.sizitisi.molivi = false;
	Client.node('moliviStop');
}

jQuery.fn.proepiskopisi = function(kimeno) {
	Prefadoros.sizitisi.moliviClear(Prefadoros.ego.login);
	var sxolio = new Sizitisi({
		'pektis': Prefadoros.ego.login,
		'kimeno': kimeno,
	});

	return this.each(function() {
		$(this).sizitisiAdd(sxolio, 'sizitisiProepiskopisi');
	});
}

jQuery.fn.sizitisiAdd = function(sxolio, klasi) {
	var xroma, jql;

	if (klasi === undefined) klasi = 'sizitisiSxolio';
	else klasi = 'sizitisiSxolio ' + klasi;
	if ((sxolio.kimeno == Prefadoros.sxolioKodikos.moliviTrapezi) ||
		(sxolio.kimeno == Prefadoros.sxolioKodikos.moliviKafenio)) klasi += ' sizitisiMolivi';

	if (Prefadoros.sizitisi.zebraColor.hasOwnProperty(sxolio.pektis))
		xroma = Prefadoros.sizitisi.zebraColor[sxolio.pektis];
	else {
		Prefadoros.sizitisi.zebraColor[sxolio.pektis] =
			(xroma = Prefadoros.sizitisi.zebraPaleta[Prefadoros.sizitisi.zebraIndex]);
		Prefadoros.sizitisi.zebraIndex++;
		if (Prefadoros.sizitisi.zebraIndex >= Prefadoros.sizitisi.zebraPaleta.length)
			Prefadoros.sizitisi.zebraIndex = 0;
	}

	jql = $(this);
	return this.each(function() {
		var pote, sxolia;

		// Τα νέα σχόλια έχουμε φροντίσει να φέρουν μηδενική χρονική στιγμή
		// αποστολής, ώστε να μπορούμε να τα ξεχωρίσουμε και να ενεργοποιούμε
		// τυχόν πολυμέσα που σχετίζονται με αυτά. Αμέσως μετά θέτουμε τωρινή
		// χρονική στιγμή αποστολής.

		pote = sxolio.pote;
		if (!sxolio.pote) sxolio.pote = globals.toraServer();

		sxolia = jql.children();
		if (sxolia.length > Prefadoros.maxSxolia)
			sxolia.slice(0, sxolia.length - Prefadoros.minSxolia).remove();

		$('<div>').addClass(klasi).
			append($('<div>').addClass('sizitisiPektis').css({color:'#'+xroma}).text(sxolio.pektis)).
			append($('<div>').addClass('sizitisiKimeno').
				append(Prefadoros.sizitisi.decode(sxolio.kimeno, pote, jql))).
			append($('<div>').addClass('sizitisiPote').text(sxolio.pote)).
			append($('<div>').addClass('sizitisiEtop')).
		appendTo(jql);

		if (!jql.data('noScroll')) jql.scrollKato(!pote);
	});
}

jQuery.fn.feredataSet = function(sizitisi) {
	return this.each(function() {
		var i;
		for (i = 0; i < sizitisi.length; i++) {
			$(this).sizitisiAdd({
				'pektis': sizitisi[i].p,
				'kimeno': sizitisi[i].k,
				'pote': sizitisi[i].w,
			});
		}
	});
}

Prefadoros.sizitisi.moliviClear = function(login) {
	$('.sizitisiMolivi').each(function() {
		if ($(this).find('.sizitisiPektis').text() == login) $(this).remove();
	});
}

Prefadoros.sizitisi.decode = function(s, pote, jql) {
	var tmima, x, i;

	if (s == Prefadoros.sxolioKodikos.moliviKafenio)
		return $('<img>').addClass('sizitisiMoliviIconKafenio').attr({src: 'images/endixi/moliviKafenio.gif'});

	if (s == Prefadoros.sxolioKodikos.moliviTrapezi)
		return $('<img>').addClass('sizitisiMoliviIconTrapezi').attr({src: 'images/endixi/moliviTrapezi.gif'});

	if (s == Prefadoros.sxolioKodikos.korna) {
		x = $('<div>').addClass('sizitisiKorna');
		i = $('<img>').addClass('sizitisiKornaIcon').attr({src: 'images/cpanel/korna.png'});
		x.append(i);
		if (!pote) Prefadoros.sizitisi.korna(i);
		return x;
	}

	if (s.match(/^https?:\/\/youtu\.be\//)) {
		s = s.replace(/^https?:\/\/youtu\.be\//, '');
		return $('<br/><iframe width="403" height="227" src="//www.youtube.com/embed/' +
			s + '" frameborder="0" allowfullscreen></iframe>');
	}

	tmima = s.split('^');

	if (tmima.length < 2) return s.scriptSafe();

	if (Funchat.item.hasOwnProperty(tmima[1])) {
		x = Funchat.item[tmima[1]];
		if (tmima[0] == '=') tmima[0] = x['k'];

		if (pote) return Funchat.decode(tmima[1], tmima[0]);

		if (Funchat.decodeMap.hasOwnProperty(tmima[1]))
			return Funchat.decodeMap[tmima[1]](tmima[1], tmima[0], jql);

		if (x.hasOwnProperty('s')) Funchat.ixos(x);
		else if (x.hasOwnProperty('y')) Funchat.youTubeVideo(x);
		else if (x.hasOwnProperty('S')) Funchat.exoIxos(x);

		return Funchat.decode(tmima[1], tmima[0]);
	}

	x = '';
	for (i = 0; i < tmima.length; i++) {
		if (tmima[i].match(/^[0-9]+:[0-9]+$/)) {
			x += Prefadoros.sizitisi.decodeEmoticon(tmima[i]);
			continue;
		}

		x += tmima[i].scriptSafe();
	}

	return x;
}

Prefadoros.sizitisi.korna = function(korna) {
	Client.sound.play('korna.ogg');
	setTimeout(function() {
		korna.animate({width: '+=10px'}, 1100, 'easeInBounce', function() {
			korna.animate({width: '-=10px'}, 400, 'easeOutBounce');
		});
		korna.parents('.sizitisiSxolio').find('.sizitisiPektis').tsalimi();
	}, 200);
}

Prefadoros.sizitisi.decodeEmoticon = function(s) {
	var tmima, elist;

	tmima = s.split(':');
	if (tmima.length != 2) return s.scriptSafe() + '^';

	elist = Prefadoros.emoticon.set;
	if (tmima[0] >= elist.length) return s.scriptSafe() + '^';

	elist = elist[tmima[0]];
	if (tmima[1] >= elist.length) return s.scriptSafe() + '^';

	return '<img class="sizitisiEmoticon" src="images/emoticons/set' +
		tmima[0] + '/' + elist[tmima[1]] + '" />';
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Funchat = {};

Funchat.decodeMap = {
	'AMAN': function(kodikos, kimeno, sizitisi) {
		try {
			if (!kimeno) kimeno = '';
			return $('<div>').
				append('<video src="' + Client.funchatServer +
					'aman.mp4" type="video/mp4" autoplay style="width: 300px;" />').
				append('<div>' + kimeno + '</div>');
		} finally {
			if (sizitisi.data('noScroll')) return;
			setTimeout(function() {
				sizitisi.scrollKato();
			}, 1000);
		}
	},

	'TPPS': function(kodikos, kimeno, sizitisi) {
		var jql, img, kel, item = Funchat.item[kodikos];
		img = $('<img>').attr({src: Client.funchatServer + 'notpps1.png'}).css({width: '120px'});
		kel = $('<div>').text(item.k);
		jql = $('<div>').append(img).append(kel);
		Client.sound.play('doing.ogg');
		setTimeout(function() {
			Client.sound.play('fiouit.ogg');
			img.attr({src: Client.funchatServer + 'notpps2.png'}).animate({
				width: '+=100px',
			}, 200, function() {
				setTimeout(function() {
					sizitisi.css({backgroundColor: 'red'}).scrollKato();
				}, 100);
			});
			if (kimeno == item.k) kimeno = 'Μπορούν να γίνουν χειρότερα!';
			kel.text(kimeno);
		}, 3000);
		return jql;
	},
};

// Η function "decode" δέχεται έναν κωδικό funchat και το κείμενο της ατάκας, και
// επιστρέφει ως jQuery element list το σχόλιο που θα προστεθεί στη συζήτηση. Στο
// σχόλιο  περιλαμβάνεται η εικόνα και το κείμενο.

Funchat.decode = function(kodikos, kimeno) {
	var item, html = '', ikona;

	if (!Funchat.item.hasOwnProperty(kodikos)) return html;
	item = Funchat.item[kodikos];
	ikona = item.hasOwnProperty('i') ? item['i'] : null;

	if (ikona && kimeno) html += '<br />';
	if (ikona) html += '<img class="sizitisiFunchatIkona" src="' + Client.funchatServer + item['i'] + '"';
	if (item.hasOwnProperty('l')) html += ' style="width: ' + item['l'] + 'px; max-height: none;"';
	html += ' />';
	if (kimeno) html += '<div>' + kimeno.scriptSafe() + '</div>';
	return $(html);
}

// Η function "ixos" δέχεται ένα funchat item και αναλαμβάνει να
// παίξει τον ήχο που ενυπάρχει στο property "s". Ο ήχος θα παιχτεί
// καθυστέρηση εφόσον υπάρχει property "d" όπου καθορίζεται καθυστέρηση
// σε milliseconds και με ένταση που καθορίζεται από το property "e".

Funchat.ixos = function(s) {
	var delay, entasi;

	if (!s.hasOwnProperty('s')) return;
	delay = (s.hasOwnProperty('d') && (s['d'] > 10)) ? parseInt(s['d']) : 10;
	entasi = (s.hasOwnProperty('e') && (s['e'] > 0)) ? parseInt(s['e']) : Client.sound.entasi['ΚΑΝΟΝΙΚΗ'];
	if (entasi > Client.sound.entasi['ΔΥΝΑΤΗ']) vol = Client.sound.entasi['ΔΥΝΑΤΗ'];
	setTimeout(function() {
		Client.sound.play(s['s'], entasi);
	}, delay);
}

// Η function "youTubeVideo" δέχεται ένα funchat item και αναλαμβάνει να
// παίξει το YouTube video που ενυπάρχει στο property "y". Το video θα
// παιχτεί με καθυστέρηση που καθορίζεται από το property "d" (σε milliseconds).

Funchat.youTubeVideo = function(s) {
	var delay;

	if (!s.hasOwnProperty('y')) return;
	delay = (s.hasOwnProperty('d') && (s['d'] > 10)) ? parseInt(s['d']) : 10;
	setTimeout(function() {
		$('#ixos').append($('<iframe src="http://www.youtube.com/embed/' +
			s['y'] + '?autoplay=1&rel=0&controls=0&showinfo=0"></iframe>'));
	}, delay);
}

// Η function "exoIxos" δέχεται ένα funchat item και αναλαμβάνει να παίξει
// τον εξωτερικό ήχο που ενυπάρχει στο property "S". Ο ήχος θα παιχτεί
// καθυστέρηση εφόσον υπάρχει property "d" όπου καθορίζεται καθυστέρηση
// σε milliseconds και με ένταση που καθορίζεται από το property "e".

Funchat.exoIxos = function(s) {
	var delay, entasi, vol, ixos;

	ixos = $('#ixos').akrivosEna();
	ixos.find('.funchatIxos').remove();

	if (!Client.sound.entasi.hasOwnProperty(Client.session.entasi)) Client.session.entasi = 'ΚΑΝΟΝΙΚΗ';
	entasi = Client.sound.entasi[Client.session.entasi];
	if (entasi < 1) return;

	Funchat.sigasiEndixi();
	delay = (s.hasOwnProperty('d') && (s['d'] > 10)) ? parseInt(s['d']) : 10;
	vol = (s.hasOwnProperty('e') && (s['e'] > 0)) ? parseInt(s['e']) : Client.sound.entasi['ΚΑΝΟΝΙΚΗ'];
	if (vol > Client.sound.entasi['ΔΥΝΑΤΗ']) vol = Client.sound.entasi['ΔΥΝΑΤΗ'];
	$('<audio>').attr({src: Client.funchatServer + s['S']}).addClass('funchatIxos').appendTo(ixos).each(function() {
		var audio = this;
		audio.volume = (entasi / Client.sound.entasi['ΔΥΝΑΤΗ']) * (vol / Client.sound.entasi['ΔΥΝΑΤΗ']);
		setTimeout(function() { audio.play(); }, delay);
	});
}

// Η function "ixosEndixi" κάνει εμφανές το εικονίδιο σίγασης ήχων του funchat
// και καλείται κατά την έναρξη των ηχητικών εφέ του funchat, ώστε να γνωρίζει
// ο χρήστης ότι μπορεί να διακόψει την αναπαραγωγή του ήχου.

Funchat.sigasiEndixi = function() {
	Prefadoros.sizitisi.sigasiJQL.attr({src: 'images/endixi/svisimo.gif'})
	setTimeout(function() {
		Prefadoros.sizitisi.sigasiJQL.attr({src: 'images/pss/sigasi.png'});
	}, 1000);
}
